home *** CD-ROM | disk | FTP | other *** search
/ Ultimate Screensaver / Ultimate Screen Savers Collection (CMS Distributing) (1996).ISO / saver3 / xwsave1 / xwinsave.cpp < prev    next >
C/C++ Source or Header  |  1995-03-01  |  10KB  |  266 lines

  1. /* //////////////////////////////////////////////////////////////////////
  2.  
  3.   Module:   Xwinsave.cpp - A Microsoft Windows screen saver using the
  4.                            screen savers from the X11 program Xlock.c
  5.  
  6.   Author:   Perry K. Sloope
  7.  
  8.   Acknowledgements:  A few pieces of the code in this file were taken
  9.                      directly from xlock.c by Patrick J. Naughton.
  10.                      In keeping with his copyright directives please note the
  11.                      following:
  12.  
  13.        Xlock.c  Copyright (c) 1988-91 by Patrick J. Naughton.
  14.  
  15.        Permission to use, copy, modify, and distribute this software and its
  16.        documentation for any purpose and without fee is hereby granted,
  17.        provided that the above copyright notice appear in all copies and that
  18.        both that copyright notice and this permission notice appear in
  19.        supporting documentation.
  20.  
  21.        This file is provided AS IS with no warranties of any kind.  The author
  22.        shall have no liability with respect to the infringement of copyrights,
  23.        trade secrets or any patents by this file or any part thereof.  In no
  24.        event will the author be liable for any lost revenue or profits or
  25.        other special, indirect and consequential damages.
  26.  
  27.   The above notice also applies to this file and program. Now that that is out
  28.   of the way, the pieces of code that were adapted from xlock.c are primarly
  29.   the struct LockStruct LockProcs and a few pieces of code that use this
  30.   structure, (the way in which the callback and init function pointers are used.)
  31.   The manner in which LockStruct is designed and used is really a nice piece
  32.   of work.
  33.  
  34.   The X11 screen saver modules (pyro.c, flame.c, etc.) are the original X11
  35.   code.  One or two of the modules were modifed slightly to account for
  36.   the differences in int and long variables. (int and long seem to both
  37.   be 4 bytes in X11, at least for the Linux Gcc version.) The remainder
  38.   were untouched.
  39.  
  40.   This was built and compiled using Borland 4.5 C++.  However I tried to design
  41.   the code so that it was independent of the compiler.  It should be possible
  42.   to compile this using any C++ compiler that can produce MS Windows 3.1
  43.   executables.  No special library files or dlls are required other than
  44.   those needed to build any MS Windows program.
  45.  
  46. //////////////////////////////////////////////////////////////////////  */
  47.  
  48.  
  49. #include "xwinsave.h"
  50. #include"ssclass.hpp"
  51.  
  52.  
  53. LockStruct LockProcs[] =
  54. {
  55.     {"qix", initqix, drawqix, 30, 64, 1.0, "Spinning lines a la Qix(tm)"},
  56.     {"pyro", initpyro, drawpyro, 10, 25, 1.0, "Fireworks"},
  57.     {"flame", initflame, drawflame, 10, 20, 1.0, "Cosmic Flame Fractals"},
  58.     {"swarm", initswarm, drawswarm, 10, 100, 1.0, "Swarm of bees"},
  59.     {"hop", inithop, drawhop, 0, 1000, 1.0, "Hopalong iterated fractals"},
  60. /*    {"life", initlife, drawlife, 1000000, 100, 1.0, "Conway's game of Life"}, */
  61.     {"rotor", initrotor, drawrotor, 10, 4, 0.4, "Tom's Roto-Rooter"},
  62.     {"worm", initworm, drawworm, 10, 20, 1.0, "Wiggly Worms"},
  63.     {"spline", initspline, drawspline, 20, 6, 0.4, "Moving Splines"},
  64.     {"galaxy", initgalaxy, drawgalaxy, 10, 3, 1.0, "Spinning galaxies"},
  65.     {"kaleid", initkaleid, drawkaleid, 100, 4, 1.0, "Kaleidoscope"},
  66. //    {"grav", initgrav, drawgrav, 10, 10, 1.0, "Orbiting planets"},
  67. /*    {randomstring, NULL, NULL, 0, 0, 0.0, "Random mode"},
  68.     {"blank", initblank, drawblank, 5000000, 1, 1.0, "Blank screen"},
  69.     {"sphere", initsphere, drawsphere, 10000, 1, 1.0, "Shaded spheres"},
  70.     {"hyper", inithyper, drawhyper, 10000, 1, 1.0, "Spinning Tesseract"}, */
  71.     {"helix", inithelix, drawhelix, 1000, 1, 1.0, "Helix"},
  72. /*
  73.     {"rock", initrock, drawrock, 30000, 100, 1.0, "Asteroid field"},
  74.     {"blot", initblot, drawblot, 10000, 6, 0.4, "Rorschach's ink blot test"},
  75.     {"grav", initgrav, drawgrav, 10000, 10, 1.0, "Orbiting planets"},
  76.     {"bounce", initbounce, drawbounce, 10000, 10, 1.0, "Bouncing ball"},
  77.     {"world", initworld, drawworld, 100000, 8, 0.3, "Random Spinning Earths"},
  78.     {"rect", initrect, drawrect, 10000, 100, 1.0, "Greynetic rectangles"},
  79.     {"bat", initbat, drawbat, 10000, 6, 1.0, "Flying Bats"},
  80.     {"image", initimage, drawimage, 2000000, 8, 0.3, "Random bouncing image"}, */
  81. };
  82.  
  83. // These globals are expected by some of the screen saver modules.
  84. perscreen Scr[MAXSCREENS];
  85. long batchcount = 16;
  86. int screen;     /* Pyro.c expects these. They 're placebos. */
  87. int mono = 0, deflt;
  88. Display *dsp = NULL;
  89. HDC Ghdc;
  90.  
  91. char AppName[] = "ScreenSaver.XwinSave";
  92.  
  93. #define NUMPROCS (sizeof LockProcs / sizeof LockProcs[0])
  94.  
  95. BOOL FAR PASCAL _export ConfigDlgFunc (HWND hDlg, UINT message,
  96.                                                  UINT wParam, LONG lParam);
  97.  
  98. class XwinSave : public ScreenSave
  99. {
  100.      protected:
  101.         Window win;  /* window used to cover screen */
  102.         int timedelay;
  103.         void (*callback) (Window);
  104.         void (*init) (Window);
  105.  
  106.      public:
  107.         virtual void ShowScreenSaver();
  108.         virtual int getSelection(char *NameSelect);
  109.         XwinSave(char *AppNm, HANDLE hInst, HANDLE hPrevInst, LPSTR CmdLine,
  110.                 int CmdShow);
  111.         ~XwinSave();
  112.         virtual void InitSS();  // This is called in RunScreenSaver().
  113. };
  114.  
  115.  
  116.  
  117. XwinSave::XwinSave(char *AppNm, HANDLE hInst, HANDLE hPrevInst, LPSTR CmdLine,
  118.                   int CmdShow):ScreenSave(AppNm,hInst,hPrevInst,CmdLine,CmdShow)
  119. {
  120.     screen = 0;
  121.     callback = NULL;
  122.     init = NULL;
  123.     DlgName = "CONFIGDIALOG";
  124.     pConfigDlg = ::ConfigDlgFunc;
  125.     Scr[screen].gc = NULL;
  126.  
  127. }
  128.  
  129.  
  130. XwinSave::~XwinSave()
  131. {
  132.     if (Scr[screen].gc != NULL)
  133.        free (Scr[screen].gc);
  134. }
  135.  
  136.  
  137. int XwinSave::getSelection(char *NameSelect)
  138. {
  139.      int i = 0;
  140.      while (i < NUMPROCS)
  141.      {
  142.         if (strncmp(LockProcs[i].cmdline_arg,NameSelect,strlen(LockProcs[i].cmdline_arg)) == 0)
  143.            break;
  144.         else
  145.           i++;
  146.      }
  147.      if (i >= NUMPROCS)
  148.        i = random() % (NUMPROCS);
  149.      return i;
  150. }
  151.  
  152.  
  153. void XwinSave::InitSS()
  154. {
  155.      HPEN pen;
  156.      int i;
  157.      XGCValues   xgcv;
  158.      int selection = 3;
  159.      u_char red[64],green[64],blue[64];
  160.      char NameSelect[MAXSELECTION_NAMESZ];
  161.  
  162.      srandom((unsigned)time(NULL));
  163.      win.hdc = hdc;
  164.      win.hWnd = hWnd;
  165.      win.hbrBackground = wndclass.hbrBackground;
  166.      screen = 0;
  167.      GetPrivateProfileString(AppName,DEFSCRNSAVE, "random",NameSelect,sizeof(NameSelect),INI_FILE);
  168.      if (NameSelect[0] == NULL)
  169.        strcpy(NameSelect,"random");
  170.      selection = getSelection(NameSelect);
  171.  
  172.      Ghdc = win.hdc;
  173.      SetBkColor(win.hdc,0);
  174.      pen = GetStockObject (WHITE_PEN);
  175.      SelectObject(win.hdc,pen);
  176.      callback = LockProcs[selection].lp_callback;   // Screen we will use this time.
  177.      init = LockProcs[selection].lp_init;
  178.  
  179.      timedelay = LockProcs[selection].def_delay;
  180.      batchcount = LockProcs[selection].def_batchcount;
  181.  
  182.      Scr[screen].gc = XCreateGC(dsp, win,
  183.                       GCForeground | GCBackground, &xgcv);
  184.      Scr[screen].npixels = 0;
  185.      hsbramp(0.0, 1, 1.0, 1.0, 1, 1.0, 64, red, green, blue);
  186.      for (i = 0; i < 64; i++)
  187.      {
  188.        Scr[screen].pixels[i] = RGB (red[i],green[i],blue[i]);
  189.        Scr[screen].npixels++;
  190.      }
  191.      init(win);
  192. }
  193.  
  194.  
  195. void XwinSave::ShowScreenSaver()
  196. {
  197.      callback(win);
  198.      usleep(timedelay);
  199. }
  200.  
  201.  
  202. // This is the callback function for the Setup dialog invoked when the
  203. // program is executed with the -c option.  If passwording is added, this
  204. // is one of the places to put it.
  205.  
  206. BOOL FAR PASCAL _export ConfigDlgFunc (HWND hDlg, UINT message,
  207.                                                  UINT wParam, LONG lParam)
  208. {
  209.      static HWND  hSelectSS;
  210.      static char  selection[MAXSELECTION_SZ];
  211.      WORD i,deflt = 0;
  212.      char buf[MAXSELECTION_SZ],defName[MAXSELECTION_NAMESZ];
  213.  
  214.      switch (message)
  215.      {
  216.           case WM_INITDIALOG:
  217.                hSelectSS = GetDlgItem (hDlg, ID_SELECTSCREEN);
  218.                GetPrivateProfileString(AppName,DEFSCRNSAVE, "random",defName,sizeof(de